$.extend({
	/* 数组模糊查找第一个
	 * @param sFind:需要查找的字符串
	 * @param vData:当前查找的数组
	 * return 返回第一次匹配到的数组第i项对应的值
	 * @Example （中登证书控件取出来的DN号是倒叙的）
	 *   var dn=InfoSecNetSign1.NSGetSignerCertInfo(1);
	 *   //dn="C=CN,O=CSDC Test,OU=Customers01,CN=C@1@1000003537";
	 *   var dnArr = dn.split(",");
	 *   var tempStr = "";
	 *	 //证书DN号重新排序衔接 ( CN=?,OU=?,O=?,C=? )
	 *	 var cnStr = findeach("CN=",dnArr);
	 *	 var cnArr = cnStr.split("@");
	 *	 var certType = cnArr[1];
	 *	 tempStr=cnStr+","+findeach("OU=",dnArr)+","+findeach("O=",dnArr)+","+findeach("C=",dnArr);
	 *	 dn = tempStr;//重新排序完成
	 *   //dn="CN=C@1@1000003537,OU=Customers01,O=CSDC Test,C=CN";
	 */
	'findEach':function (sFind,vData){
		var nPos;    
		var vResult = "";    
		for(var i in vData){    
			var sTxt=vData[i]||'';    
			nPos=sTxt.indexOf(sFind);    
			if(nPos>=0){    
				vResult = sTxt;  
				break;  
			}    
		}
		return  $.trim(vResult);
	}
,
	/* 检测浏览器类型及版本
	 * 支持IE7-11
	 * @Example
	 * var browserMatchForApex = $.uaMatch(); 
	 * return { browser : "IE", version : "9.0"}
	 * return { browser : "firefox", version : "2.0"}
	 * return { browser : "chrome", version : "3.0"}
	 */
	'uaMatch':function () {  
		//浏览器类型版本检测
		var userAgentForApex = navigator.userAgent;  
		var ua = userAgentForApex.toLowerCase();
		var rMsie = /(msie\s|trident.*rv:)([\w.]+)/,   
	    rFirefox = /(firefox)\/([\w.]+)/,   
	    rOpera = /(opera).+version\/([\w.]+)/,   
	    rChrome = /(chrome)\/([\w.]+)/,   
	    rSafari = /version\/([\w.]+).*(safari)/; 
	    var match = rMsie.exec(ua);  
	    if (match != null) {  
	        return { browser : "IE", version : match[2] || "0" };  
	    }  
	    var match = rFirefox.exec(ua);  
	    if (match != null) {  
	        return { browser : match[1] || "", version : match[2] || "0" };  
	    }  
	    var match = rOpera.exec(ua);  
	    if (match != null) {  
	        return { browser : match[1] || "", version : match[2] || "0" };  
	    }  
	    var match = rChrome.exec(ua);  
	    if (match != null) {  
	        return { browser : match[1] || "", version : match[2] || "0" };  
	    }  
	    var match = rSafari.exec(ua);  
	    if (match != null) {  
	        return { browser : match[2] || "", version : match[1] || "0" };  
	    }  
	    if (match != null) {  
	        return { browser : "", version : "0" };  
	    }  
	}
,
	/*插件检测 支持IE与谷歌 火狐等浏览器
	 * @example 
	 * plugName = {
	 *				IE:"AxPwdPlugCtrl",   //IE浏览器对应的ActiveX名称
	 *				NOTIE:"axpwdplug"     //非IE浏览器对应的plug名称
	 *			  }
	 * return true or  false
	 */
	'hasPlug':function (plugName){
		if(browserMatchForApex.browser=="IE"){
			try{
	           new ActiveXObject(plugName.IE);
	           return true;
		     }catch(e){
		       return false;
		     }
		}else{
			var tmpName=plugName.NOTIE.toLowerCase();
		    var plugins_arr=navigator.plugins;
		    for(var i=0;i<plugins_arr.length;i++){
		       if(plugins_arr[i].name.toLowerCase().indexOf(tmpName)>-1){
		       		//document.title=plugins_arr[i].description+"-->"+plugins_arr[i].filename;
		       		return true;
		       }
		    }
		    return false;
		}
	}
,
	/*
	 * 添加事件监听函数
	 * obj        要添加监听的对象或元素  注：非jquery对象
	 * eventName  事件名
	 * fun        监听函数的名称
	 * param      给监听函数传的参数，这里就传了一个参数
	 */
	'addEventHandler':function (obj,eventName,fun,param){
	    var fn = fun;
	    if(param){
	        fn = function(e){
	            fun.call(this, param);  //继承监听函数,并传入参数以初始化;
	        }
	    }
	    if(obj.attachEvent){
	        obj.attachEvent('on'+eventName,fn);
	    }else if(obj.addEventListener){
	        obj.addEventListener(eventName,fn,false);
	    }else{
	        obj["on" + eventName] = fn;
	    }
	}
,
	/*
	 * 删除事件监听函数
	 * obj        要添加监听的对象或元素
	 * eventName  事件名
	 * fun         监听函数的名称
	 */
	'removeEventHandler':function (obj, eventName, fun) {
	    if (obj.removeEventListener)
	        obj.removeEventListener(eventName, fun, false);
	    else if (obj.detachEvent)
	        obj.detachEvent("on" + eventName, fun);
	    else delete obj["on" + eventName];
	}
,
	/*flash控件检测
	 * return {f:1,v:10.10}
	 * 0:未安装  1：已安装  v：对应的版本号
	 */
	'flashChecker':function (){
		var hasFlash=0;　　　　//是否安装了flash
		var flashVersion=0;　　//flash版本
		
		if(document.all){
			var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); 
			if(swf) {
				hasFlash=1;
				VSwf=swf.GetVariable("$version");
				flashVersion=parseInt(VSwf.split(" ")[1].split(",")[0]); 
			}
		}else{
			if (navigator.plugins && navigator.plugins.length > 0){
				var swf=navigator.plugins["Shockwave Flash"];
				if (swf){
					hasFlash=1;
				    var words = swf.description.split(" ");
				    for (var i = 0; i < words.length; ++i){
				         if (isNaN(parseInt(words[i]))) continue;
				         flashVersion = parseInt(words[i]);
					}
				}
			}
		}
		return {f:hasFlash,v:flashVersion};
	}
,
	/* 身份验证函数
	 * v:身份证号码  只支持18位二代身份证
	 * @example $.Valid_SFZ(v)
	 * return {code:0,msg:'验证通过',birthday:birthday,sex:sex}
	 * 提供者CIF2
	 */
	"Valid_SFZ": function(v){
		var id_length = v.length;
		var sex;
		var birthday;
		var dd;
		var mm;
		var yyyy;
		if (id_length == 0) {
			return {
				code: -1,
				msg: '身份证不允许为空,请输入'
			};
		}
		
		if (id_length != 18) {
			return {
				code: -2,
				msg: "身份证号长度应为18位"
			};
		}
		
		if (id_length == 18) {
			if (v.indexOf("X") > 0 && v.indexOf("X") != 17) {
				// alert("身份证中\"X\"输入位置不正确！");
				// return false;
				return {
					code: -4,
					msg: "身份证中\"X\"输入位置不正确！"
				};
			}
			yyyy = v.substring(6, 10);
			if (yyyy > 2200 || yyyy < 1800) {
				//alert("输入身份证号,年度非法！");
				// return false;
				return {
					code: -5,
					msg: "输入身份证号,年度非法"
				};
			}
			mm = v.substring(10, 12);
			if (mm > 12 || mm <= 0) {
				//  alert("输入身份证号,月份非法！");
				//   return false;
				return {
					code: -6,
					msg: "输入身份证号,月份非法"
				};
			}
			
			dd = v.substring(12, 14);
			if (dd > 31 || dd <= 0) {
				return {
					code: -7,
					msg: "输入身份证号,日期非法"
				};
			}
			
			if (v.charAt(17) == "X") {
				if ("X" != this.GetVerifyBit(v)) {
					return {
						code: -8,
						msg: "请检查身份证最后一位[" + v + ']'
					};
				}
				
			}
			else {
				if (v.charAt(17) != this.GetVerifyBit(v)) {
					return {
						code: -5,
						msg: "请检查身份证最后一位[" + v + ']'
					};
				}
			}
			
			birthday = v.substring(6, 10) + "-" + v.substring(10, 12) + "-" + v.substring(12, 14);
			if ("13579".indexOf(v.substring(16, 17)) > -1) {
				sex = "1";
			}
			else {
				sex = "2";
			}
		}
		return {
			code: 0,
			msg: '验证通过',
			birthday: birthday,
			sex: sex
		};
	},
	"GetVerifyBit": function(id){
		var result;
		var nNum = eval(id.charAt(0) * 7 + id.charAt(1) * 9 + id.charAt(2) * 10 + id.charAt(3) * 5 + id.charAt(4) * 8 +
		id.charAt(5) * 4 +
		id.charAt(6) * 2 +
		Number(id.charAt(7)) +
		id.charAt(8) * 6 +
		id.charAt(9) * 3 +
		id.charAt(10) * 7 +
		id.charAt(11) * 9 +
		id.charAt(12) * 10 +
		id.charAt(13) * 5 +
		id.charAt(14) * 8 +
		id.charAt(15) * 4 +
		id.charAt(16) * 2);
		nNum = nNum % 11;
		switch (nNum) {
			case 0:
				result = "1";
				break;
			case 1:
				result = "0";
				break;
			case 2:
				result = "X";
				break;
			case 3:
				result = "9";
				break;
			case 4:
				result = "8";
				break;
			case 5:
				result = "7";
				break;
			case 6:
				result = "6";
				break;
			case 7:
				result = "5";
				break;
			case 8:
				result = "4";
				break;
			case 9:
				result = "3";
				break;
			case 10:
				result = "2";
				break;
		}
		return result;
	}
});